<?php

namespace Utils;
/**
* TP5活动海报生成
*/

// alon 250079279@qq.com

use \Think\Session;
use \Think\Config;

class Qrcode{

	/**
	 * 生成二维码
	 * @param  string $value 生成二维码的地址
	 * @param  string $value 生成二维码的大小，默认4
	 * @param  string $value 边距，默认为0
	 * @return string 文件路径地址
	 */
	public static function qrcode($value = 'https://www.***.cn',$matrixPointSize = 4,$margin = 0){
	    //$value = "http://www.baidu.com"; //获取生成二维码的地址
    	//$matrixPointSize = 4; //获取生成二维码的大小，默认4
        if(strpos($value, "http") === 0 || strpos($value, "https") === 0){
            $value = urldecode($value);
        }
        vendor("phpqrcode.phpqrcode");
        $urls = '';
        $errorCorrectionLevel = 'L';//容错级别
        $filepath = ROOT_PATH.'/public/uploads/qrcode/';
        $urls .= '/uploads/qrcode/';
        if(!is_dir($filepath)){
        	 mkdir($filepath,0777,true);
        }
        $imgs = md5($value).'.png';
        $urls .= $imgs;
        $QR = $filepath.$imgs;
        //生成二维码图片
        \QRcode::png($value, $QR, $errorCorrectionLevel, $matrixPointSize, $margin, true);       
        return $urls;
	} 
    /**
     * 合成海报图
     * @param  string  $banner 业务宣传图
     * @param  string  $qrcode 二维码
     * @param  string  $title  业务名称
     * @param  string  $desc   业务描述
     * @param  integer $money  业务金额
     * @param  integer $Free 是否首月免费
     * @return [type]          [description]
     */
    public function buildPhoto($banner = '',$qrcode = '',$title = '业务名称',$desc = '简介',$money = 3,$iffree = 0){
        $filepath = ROOT_PATH."/public";

        $font = $filepath.'/static/lib/font/simyou.ttf';
        $yhbold = $filepath.'/static/lib/font/yhbold.ttf';
        $img = $filepath.'/uploads/qrcode/'.Session::get('uid').'/';
        if(!is_dir($img)){
             mkdir($img,0777,true);
        }
        $_imgs = md5($banner.$title.$desc.$money).'.png';
        $img .= $_imgs;

        $showimg = '/uploads/qrcode/'.$_imgs;

        $bg = $filepath.'/static/lib/img/bg.png';//背景图片

        //$banner = 'http://111.11.228.30:8050/upload/baseservice/1527579964365.jpg';
        //$banner = Config::get('urlsite.ht_site_url').$banner;
        $banner = $filepath.'/'.$banner;//bannser
        logs($banner,'banner');

        $box_qrcode = $filepath.'/static/lib/img/box_qrcode.png';//二维码框

        $free_img = $filepath.'/static/lib/img/free.png';//首月免费图片
        
        $qrcode = $filepath.$qrcode;//二维码
        
        $m_bg = imagecreatefrompng($bg);//背景图片画布
        $width = imagesx($m_bg);//背景图片宽度
        $height = imagesy($m_bg);  //背景图片高度

        //背景图
        $target = imagecreatetruecolor($width,$height);
        imagecopyresampled ($target,$m_bg, 0, 0, 0, 0, $width, $height, $width, $height );

        //业务图
        $imgtype = self::extImgsType($banner);
        if($imgtype == 'png'){
            $m_banner = imagecreatefrompng($banner);//业务图片画面
        }else{
            $m_banner = imagecreatefromjpeg($banner);//业务图片画面
        }
        imagecopymerge ($target,$m_banner, 0, 0, 0, 0, imagesx($m_banner),imagesy($m_banner),100);

        //二维码
        $m_qrcode = imagecreatefrompng($qrcode);//业务图片画面
        imagecopymerge ($target,$m_qrcode, 560, 594, 0, 0, imagesx($m_qrcode),imagesy($m_qrcode),100);

         //二维码框
        $m_box_qrcode = imagecreatefrompng($box_qrcode);//业务图片画面
        imagecopy($target, $m_box_qrcode, 545, 520, 0, 0, 332, 390);    //合并，注意大小和座标


        //标题
        $h_fontSize = 36;//18号字体  
        $h_fontColor = imagecolorallocate ($target,51,51,51);//字体的RGB颜色  
        $fontWidth = imagefontwidth ($h_fontSize);  
        $fontHeight = imagefontheight ($h_fontSize); 

        $textWidth = $fontWidth * mb_strlen ($title); 
        imagettftext ( $target, $h_fontSize, 0, 20, 608, $h_fontColor, $yhbold, $title);

        $desc_top = 685;
        $money_top = 680 ;
        $moths_top = 675 ;
         //是否首月免费 $free_img
        if($iffree){
            $desc_top = 705;
            $money_top = 705 ;
            $moths_top = 700 ;
            $m_free_img = imagecreatefrompng($free_img);//业务图片画面
            imagecopy($target, $m_free_img, 20, 630, 0, 0, 76, 20);    //合并，注意大小和座标
        }

        $left = 110;
        if($money >= 10){
            $left = 145;
        }
         //金额
        $money = "￥".$money;
        $m_fontSize = 40;//18号字体  
        $m_fontColor = imagecolorallocate ($target,255,0,0);//字体的RGB颜色  
        $m_fontWidth = imagefontwidth ($m_fontSize);  
        $m_fontHeight = imagefontheight ($m_fontSize); 

        $m_textWidth = $m_fontWidth * mb_strlen ($money); 
        imagettftext ( $target, $m_fontSize, 0, 20, $money_top, $m_fontColor, $yhbold, $money);

        //金额
        $moths = "元/月";
        $m_fontSize = 18;//18号字体  
        $m_fontColor = imagecolorallocate ($target,99, 99, 99);//字体的RGB颜色  
        $m_fontWidth = imagefontwidth ($m_fontSize);  
        $m_fontHeight = imagefontheight ($m_fontSize); 

        $m_textWidth = $m_fontWidth * mb_strlen ($moths); 
        
        imagettftext ( $target, $m_fontSize, 0, $left, $moths_top, $m_fontColor, $font, $moths);

        //简介信息
        $temp = array("color" => array(99, 99, 99), "fontsize" =>24, "width" => 480, "left" => 20, "top" => $desc_top, "hang_size" => 40);
        self::draw_txt_to($target, $temp, $desc, true,$font);

        
       
        
        header('Content-type: image/png');

        imagepng($target,$img,5);
        
        imagedestroy ($m_qrcode);  
        imagedestroy ($target);  
        imagedestroy ($m_banner);
        imagedestroy ($m_box_qrcode);
        if($iffree){
            imagedestroy ($m_free_img);
        }
        return $showimg;
        //echo '<img src="'.$showimg.'" width="100%">';
    } 
    private function extImgsType($imgurl = ''){
        return (@end(explode(".",$imgurl)));
    }
    /**
 * 文字自动换行算法
 * @param $card 画板
 * @param $pos 数组，top距离画板顶端的距离，fontsize文字的大小，width宽度，left距离左边的距离，hang_size行高
 * @param $str 要写的字符串
 * @param $iswrite  是否输出，ture，  花出文字，false只计算占用的高度
 * @return int 返回整个字符所占用的高度
 */

function draw_txt_to($card, $pos, $str, $iswrite,$font)
{

    $_str_h = $pos["top"];
    $fontsize = $pos["fontsize"];
    $width = $pos["width"];
    $margin_lift = $pos["left"];
    $hang_size = $pos["hang_size"];
    $temp_string = "";
    $font_file = $font;
    $tp = 0;

    $font_color = imagecolorallocate($card, $pos["color"][0], $pos["color"][1], $pos["color"][2]);
    for ($i = 0; $i < mb_strlen($str); $i++) {

        $box = imagettfbbox($fontsize, 0, $font_file, $temp_string);
        $_string_length = $box[2] - $box[0];
        $temptext = mb_substr($str, $i, 1);

        $temp = imagettfbbox($fontsize, 0, $font_file, $temptext);
        if ($_string_length + $temp[2] - $temp[0] < $width) {//长度不够，字数不够，需要

            //继续拼接字符串。

            $temp_string .= mb_substr($str, $i, 1);

            if ($i == mb_strlen($str) - 1) {//是不是最后半行。不满一行的情况
                $_str_h += $hang_size;//计算整个文字换行后的高度。
                $tp++;//行数
                if ($iswrite) {//是否需要写入，核心绘制函数
                    imagettftext($card, $fontsize, 0, $margin_lift, $_str_h, $font_color, $font_file, $temp_string);
                }

            }
        } else {//一行的字数够了，长度够了。

//            打印输出，对字符串零时字符串置null
            $texts = mb_substr($str, $i, 1);//零时行的开头第一个字。

//            判断默认第一个字符是不是符号；
            $isfuhao = preg_match("/[\\\\pP]/u", $texts) ? true : false;//一行的开头这个字符，是不是标点符号
            if ($isfuhao) {//如果是标点符号，则添加在第一行的结尾
                $temp_string .= $texts;

//                判断如果是连续两个字符出现，并且两个丢失必须放在句末尾的，单独处理
                $f = mb_substr($str, $i + 1, 1);
                $fh = preg_match("/[\\\\pP]/u", $f) ? true : false;
                if ($fh) {
                    $temp_string .= $f;
                    $i++;
                }

            } else {
                $i--;
            }

            $tmp_str_len = mb_strlen($temp_string);
            $s = mb_substr($temp_string, $tmp_str_len-1, 1);//取零时字符串最后一位字符

                if (self::is_firstfuhao($s)) {//判断零时字符串的最后一个字符是不是可以放在见面
                    //讲最后一个字符用“_”代替。指针前移动一位。重新取被替换的字符。
                    $temp_string=rtrim($temp_string,$s);
                    $i--;
                }
//            }

//            计算行高，和行数。
            $_str_h += $hang_size;
            $tp++;
            if ($iswrite) {

                imagettftext($card, $fontsize, 0, $margin_lift, $_str_h, $font_color, $font_file, $temp_string);
            }
//           写完了改行，置null该行的临时字符串。
            $temp_string = "";
        }
    }

    return $tp * $hang_size;

}


function is_firstfuhao($str)
{
    $fuhaos = array("\"", "“", "'", "<", "《",);

    return in_array($str, $fuhaos);

}
}